#' 最大化的值函数
#'
#' @param ktp1 控制变量\code{k_{t+1}}
#' @param kt \code{k_t}
#' @param k0
#' @param markov 逻辑值，是不是按马尔可夫链计算这个随机模型
#' @param vlast 上一期的值函数
#'
#' @return 本期的值函数。加负号是为了后续优化的技术需求。
#'
valfun_sto <- function(ktp1, At,kt, beta, theta, delta,markov = FALSE,
                       pmkv = c(0.9,0.1),
                       k0 = seq(0.06,6,0.06), p1 = 0.8, p2 = 0.2,
                       vlast1 = rep(0,100),vlast2 = rep(0,100)){
  # 线性插值以平滑t-1期的值函数，这实际上假设了资本存量和值函数之间存在一个线性关系
  # 这是因为值函数那根曲线是由点构成的，点和点之间就用线性插值
  g1 <- signal::interp1(k0,vlast1,ktp1,'linear')
  g2 <- signal::interp1(k0,vlast2,ktp1,'linear')

  kk <- At*kt^theta-ktp1+(1-delta)*kt

  if (kk<=0.001){
    # 避免值函数为负
    ifelse (markov,
            val <- log(0.001) + beta*(pmkv[1]*g1+pmkv[2]*g2)+200*(kk-0.001),
            val <- log(0.001) + beta*(p1*g1+p2*g2)+200*(kk-0.001))
  } else {
    ifelse(markov,
           val <- log(kk)+beta*(pmkv[1]*g1+pmkv[2]*g2),
           val <- log(kk)+beta*(p1*g1+p2*g2))
  }

  return(val)
}
